package interview.javabase.thread.synchronize;

import lombok.AllArgsConstructor;

import java.util.concurrent.locks.Lock;

import static interview.javabase.thread.synchronize.AddAndSubTest.NUM;

//定义一个内部类Add,实现功能每次对i加一
@AllArgsConstructor
@SuppressWarnings("all")
public class Add implements Runnable {

    Lock lock;

    @Override
    public void run() {
        for (int i = 0; i < 10; i++)
            addOne();
    }

    public void addOne() {
// 方法1 while (true) 加 synchronized 可以实现重复获取锁的操作
//        while (true) {
//            synchronized (NUM) {
//                //TODO
//                break;
//            }
//        }

// 方法2 reentranLock.lock() 由于锁是可以重入的，这里会有自旋,
// 不需要while() 也会一直尝试，一直到获取锁为止
        try {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + "加一的值为:" + ++NUM);
        } finally {
            lock.unlock();
        }
    }
}